package com.zhz.elasticjob.annotation;

import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
import com.dangdang.ddframe.job.lite.api.strategy.JobShardingStrategy;
import com.dangdang.ddframe.job.lite.api.strategy.impl.AverageAllocationJobShardingStrategy;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author zhanghz001
 */
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ElasticDataflowJob {
    //作业名称
    String name();
    
    //cron
    String cron();
    
    //分片数量
    int shardingTotalCount() default 2;
    
    //是否覆盖注册中心的作业信息
    boolean overwrite() default false;
    
    //通过流的方式
    //如果为true,就会一直调用定时任务,直到fetchData 方法 收到null的返回,才会停下来 ,等待下一个执行周期
    //为false,就是按照cron来执行
    boolean streamingProcess() default false;
    
    //开启失败转移,某些分片所在的服务产生宕机。,会转移到其他节点重新执行,
    //这个只限于突然故障,第一次会进行补偿执行, 
    // 下一次任务到的时候,分片重新分配,不会分片到宕机的机器上
    //这个需要注意,如果因为代码错误抛出异常,是不会转移到其他节点的
    //
    boolean failover() default true;
    
    //就是任务执行前后的拦截器
    Class<? extends ElasticJobListener>[] listeners() default {};
    
    //需要使用的分片策略
    Class<? extends JobShardingStrategy> jobShardingStrategy()
            default AverageAllocationJobShardingStrategy.class;
    
    //在下一个调度周期到达之后，只要发现这个任务的任何一个分片正在执行（running），
    // 没有开启misfire(默认没有开启),任务执行完成后，会等待下一个调度周期到达后触发。
    //这个采用默认值true,保证幂等性
    
    boolean monitorExecution() default true;
}
